package models;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import play.i18n.Messages;

/**
 * Ejemplos de platos completos serían:
 * 
 * nombre,		usuario			alimentos[]
 * ("Pollito")	(Usuario1)		{(Pollo al horno), (Papas fritas)}
 * 
 * */
@Entity
public class Plato extends Comible {
	
	private static final long serialVersionUID = -7964038685145553956L;
	
	@ManyToOne
	private Usuario autor;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<PorcionAlimento> porcionesAlimentos = new ArrayList<PorcionAlimento>();

	private Date fechaCreacion;
	
	//TODO: sacar esta property?
	@ManyToMany
	private List<Paciente> pacientesAsignadosAEstePlato = new ArrayList<Paciente>(); 
	
	public Plato(String nombre) {
		super(nombre);
		this.setVisibilidad(Visibilidad.valueOf("NADIE"));
		this.setIconPath(Messages.get("icon.plato.path"));
	}

	@Override
	public Integer calcularCalorias() {
		int calorias = 0;
		for(PorcionAlimento porcionAlimento: porcionesAlimentos){
			Alimento alimento = porcionAlimento.getAlimento();
			calorias += alimento.getCaloriasPorPorcion() * porcionAlimento.getCantidad();
		}
		return calorias;
	}
	
	public static List<Comible> findByAutorEA(String nombre) {
		// devuelve los platos pertenecientes a EA con visibilidad para todos
		List<EstablecimientoAlimenticio> eas = EstablecimientoAlimenticio.findByNombre(nombre);
		List<Comible> comibles = new ArrayList<Comible>();
		
		for (EstablecimientoAlimenticio ea : eas) {
			for (Plato plato : ea.getPlatos()) {
				if (Visibilidad.TODOS.equals(plato.getVisibilidad())) {
					comibles.add(plato);
				}
			}
		}
		return comibles;
	}
	
	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Usuario getAutor() {
		return autor;
	}

	public void setAutor(Usuario autor) {
		this.autor = autor;
	}

	public void agregarPorcionAlimento(PorcionAlimento porcionAlimento) {
		this.porcionesAlimentos.add(porcionAlimento);
	}
	
	public List<PorcionAlimento> getPorcionesAlimentos() {
		return porcionesAlimentos;
	}

	public void setPorcionesAlimentos(List<PorcionAlimento> porcionesAlimentos) {
		this.porcionesAlimentos = porcionesAlimentos;
	}

	public List<Paciente> getPacientesAsignadosAEstePlato() {
		return pacientesAsignadosAEstePlato;
	}

	public void setPacientesAsignadosAEstePlato(List<Paciente> pacientesAsignadosAEstePlato) {
		this.pacientesAsignadosAEstePlato = pacientesAsignadosAEstePlato;
	}


}
